#include "adc_adc1_in1_ntc.h"

// keil中没有math.h，所以只能自己写绝对值函数
#define ABS_1(a) ((a) > 0 ? (a) : -(a))
/**
 * pa1
 * adc1-in1-
 */
void adc_adc1_in1_ntc_config(void)
{
    // 外设时钟:
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);

    // adc1
    rcu_periph_clock_enable(RCU_ADC1);
    // 重置adc
    adc_deinit();

    // 时钟分频
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
    // 采样精度
    adc_resolution_config(ADC1, ADC_RESOLUTION_12B);
    // 对齐
    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
    // 普通序列
    adc_routine_channel_config(ADC1, 0, ADC_CHANNEL_1, ADC_SAMPLETIME_15);
    adc_channel_length_config(ADC1, ADC_ROUTINE_CHANNEL, 1);

    // 模式:关闭扫描,关闭循环
    adc_special_function_config(ADC1, ADC_SCAN_MODE, DISABLE);
    adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, DISABLE);

    // 打开adc
    adc_enable(ADC1);

    // 校准
    adc_calibration_enable(ADC1);
    delay_1ms(100); // 校准需要时间
}

uint16_t temp_table_1[] = {
    58354, // -55
    55464, // -54
    52698, // -53
    50048, // -52
    47515, // -51
    45097, // -50
    42789, // -49
    40589, // -48
    38492, // -47
    36496, // -46
    34597, // -45
    32791, // -44
    31075, // -43
    29444, // -42
    27896, // -41
    26427, // -40
    25034, // -39
    23713, // -38
    22460, // -37
    21273, // -36
    20148, // -35
    19083, // -34
    18075, // -33
    17120, // -32
    16216, // -31
    15361, // -30
    14551, // -29
    13785, // -28
    13061, // -27
    12376, // -26
    11728, // -25
    11114, // -24
    10535, // -23
    9986,  // -22
    9468,  // -21
    8977,  // -20
    8513,  // -19
    8075,  // -18
    7660,  // -17
    7267,  // -16
    6896,  // -15
    6545,  // -14
    6212,  // -13
    5898,  // -12
    5601,  // -11
    5319,  // -10
    5053,  // -9
    4801,  // -8
    4562,  // -7
    4336,  // -6
    4122,  // -5
    3920,  // -4
    3728,  // -3
    3546,  // -2
    3374,  // -1
    3211,  // 0
    3057,  // 1
    2910,  // 2
    2771,  // 3
    2639,  // 4
    2515,  // 5
    2396,  // 6
    2284,  // 7
    2177,  // 8
    2076,  // 9
    1978,  // 10
    1889,  // 11
    1802,  // 12
    1720,  // 13
    1642,  // 14
    1568,  // 15
    1497,  // 16
    1430,  // 17
    1366,  // 18
    1306,  // 19
    1248,  // 20
    1193,  // 21
    1141,  // 22
    1092,  // 23
    1044,  // 24
    1000,  // 25
    957,   // 26
    916,   // 27
    877,   // 28
    840,   // 29
    805,   // 30
    771,   // 31
    739,   // 32
    709,   // 33
    679,   // 34
    652,   // 35
    625,   // 36
    600,   // 37
    576,   // 38
    552,   // 39
    530,   // 40
    509,   // 41
    489,   // 42
    470,   // 43
    452,   // 44
    434,   // 45
    417,   // 46
    401,   // 47
    386,   // 48
    371,   // 49
    358,   // 50
    344,   // 51
    331,   // 52
    318,   // 53
    306,   // 54
    295,   // 55
    284,   // 56
    274,   // 57
    264,   // 58
    254,   // 59
    245,   // 60
    236,   // 61
    228,   // 62
    220,   // 63
    212,   // 64
    205,   // 65
    198,   // 66
    191,   // 67
    184,   // 68
    178,   // 69
    172,   // 70
    166,   // 71
    160,   // 72
    155,   // 73
    150,   // 74
    145,   // 75
    140,   // 76
    135,   // 77
    131,   // 78
    126,   // 79
    122,   // 80
    118,   // 81
    115,   // 82
    111,   // 83
    107,   // 84
    104,   // 85
    101,   // 86
    97,    // 87
    94,    // 88
    91,    // 89
    89,    // 90
    86,    // 91
    83,    // 92
    81,    // 93
    78,    // 94
    76,    // 95
    74,    // 96
    71,    // 97
    69,    // 98
    67,    // 99
    65,    // 100
    63,    // 101
    61,    // 102
    60,    // 103
    58,    // 104
    56,    // 105
    55,    // 106
    53,    // 107
    52,    // 108
    50,    // 109
    49,    // 110
    47,    // 111
    46,    // 112
    45,    // 113
    43,    // 114
    42,    // 115
    41,    // 116
    40,    // 117
    39,    // 118
    38,    // 119
    37,    // 120
    36,    // 121
    35,    // 122
    34,    // 123
    33,    // 124
    32,    // 125
};
/**
 * 电压转电阻
 */
float adc_to_resistance_1(uint16_t adc_value)
{
     float Vntc = adc_value / 4096.0f * 3.3f;
	//float Vntc = adc_value / 0xfff * 3.3f;//这个不行
    float Rntc = Vntc / ((3.3f - Vntc) / 10000);
    return Rntc;
}

int resistance_to_temperature_1(float rntc)
{
    int len = sizeof(temp_table_1) / sizeof(temp_table_1[0]);
    float min = ABS_1(temp_table_1[0] * 10 - rntc);
    float derta = 0;
    int Tntc = 0 - 55;
    for (int i = 1; i < len; i++)
    {
        derta = ABS_1(temp_table_1[i] * 10 - rntc);
        if (derta < min)
        {
            min = derta;
            Tntc = i - 55;
        }
    }

    return Tntc;
}

void adc_adc1_in1_ntc_get(void)
{
    // 触发adc干活
    adc_software_trigger_enable(ADC1, ADC_ROUTINE_CHANNEL);
    // 等待eoc事件
    while (adc_flag_get(ADC1, ADC_FLAG_EOC) == 0)
        ;
    // 读取rdata寄存器内的数据
    uint32_t adc_value = adc_routine_data_read(ADC1);
    int8_t temperature = resistance_to_temperature_1(adc_to_resistance_1(adc_value));
    printf("热敏电阻温度:%d °C", temperature);
}

void adc_adc1_in1_ntc_test(void)
{
    adc_adc1_in1_ntc_config();

    while (1)
    {
        delay_1ms(1000);

        adc_adc1_in1_ntc_get();
    }
}
